const knex = require('../lib/db')
const { generateUUID } = require('./helper/uuid')

const baseCRUD = require('./helper/crud')

const Base = baseCRUD('sys_role')

// 为角色增加路由
function addMenuWithRole(roleId, routeId, domain = 'built-in') {
  return knex('sys_role_menu').insert({ role_id: roleId, menu_id: routeId, domain })
}

// 为角色增加多个路由
function addManyMenuWithRole(roleId, routeIds) {
  return Promise.all(routeIds.map((routeId) => addMenuWithRole(roleId, routeId)))
}

// 删除角色的多个路由
function deleteManyMenuWithRole(roleId, routeIds) {
  return knex('sys_role_menu').where('role_id', roleId).whereIn('menu_id', routeIds).del()
}

// 为角色增加用户
function addUserWithRole(roleId, userId) {
  return knex('sys_user_role').insert({ user_id: userId, role_id: roleId })
}

// 为角色增加多个用户
function addManyUserWithRole(roleId, userIds) {
  return Promise.all(userIds.map((userId) => addUserWithRole(roleId, userId)))
}

// 为角色删除多个用户
function deleteManyUserWithRole(roleId, userIds) {
  return knex('sys_user_role').where('role_id', roleId).whereIn('user_id', userIds).del()
}

// 根据角色ID查询路由ID
function findRouteIdWithRoleId(roleId) {
  return knex('sys_role_menu').where('role_id', roleId).select('menu_id').pluck('menu_id')
}

// 根据角色ID查询用户ID
function findUserIdWithRoleId(roleId) {
  return knex('sys_user_role').where('role_id', roleId).select('user_id').pluck('user_id')
}

// 根据用户ID查询角色代码
function getRoleCodes(userId) {
  return knex('sys_user_role').where('id', userId).join('sys_role', 'sys_user_role.role_id', 'sys_role.id').select('sys_role.code').pluck('code')
}

// 创建角色
function create(data, operator = 'admin') {
  const id = generateUUID()
  data.id = id
  return Base.create(data, operator)
}

module.exports = {
  ...Base,
  addMenuWithRole,
  addManyMenuWithRole,
  deleteManyMenuWithRole,
  addUserWithRole,
  addManyUserWithRole,
  deleteManyUserWithRole,
  findRouteIdWithRoleId,
  findUserIdWithRoleId,
  getRoleCodes,
  create
}
